package com.example.stock_trading.appium;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.TouchAction;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import io.appium.java_client.touch.offset.PointOption;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;

/**
 * @program: stock_trading
 * @description: 用来操作appium的所有操作, 后续需要做成整个工程的
 * @author: zhanghz001
 * @create: 2021-04-13 09:23
 **/
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class Huawei6Appium {
    //MobileElement
    private static AppiumDriver<AndroidElement> driver = null;
    private String stock = "000001";
    
    /**
     * 操作步骤
     * <p>
     * 手机连接到电脑,打开手机的usb调试,设置为USB 为 MTP文件传输
     * 使用adb devices 查找deviceName
     * <p>
     * 获取系统版本 platformVersion
     * adb shell getprop ro.build.version.release
     * <p>
     * appPackage/appActivity 获取
     * 获取app启动包名和启动名(⚠手机需要先打开对应app)
     * 1.Mac/Linux: 'adb shell dumpsys window windows | grep mFocusedApp’
     * 2.在 Windows 终端运⾏ 'adb shell dumpsys window windows | findstr mFocusedApp’
     * 这个是小米ui页面
     * mFocusedApp=AppWindowToken{d741897 token=Token{b76349f ActivityRecord{75709ec u0 com.miui.home/.launcher.Launcher t736}}}
     * 中信证券app打开页:
     * mFocusedApp=AppWindowToken{ec65dd5 token=Token{8d01bbf ActivityRecord{f11edde u0 com.eno.xyzq.page/com.xyzq.main.mainpage.MainActivity t789}}}
     * <p>
     * 手机进入开发者模式,
     * <p>
     * 1. 首先确认手机的开发者选项：
     * 开启开发者选项、开启USB调试、开启USB安装、开启USB调试（安全设置）、
     * 开启通过USB验证应用（这个是默认开启的，无法修改）、开启无线显示认证，
     * 其余的都是关闭状态，尤其不要启用MIUI优化
     * 2. 重新连接手机跟电脑
     * <p>
     * pip3 install uiautomator2
     * 执行python -m uiautomator2 init ，执行成功即可。
     */
    @BeforeClass
    public static void beforeClass() throws MalformedURLException {
        DesiredCapabilities cap = new DesiredCapabilities();
        //
        //
        //  platformName 平台的名称：iOS, Android, or FirefoxOS
        cap.setCapability(CapabilityType.PLATFORM_NAME, "Android");
        //  platformVersion 设备系统版本号
        //
        // * 获取系统版本 platformVersion
        // * adb shell getprop ro.build.version.release
        cap.setCapability("platformVersion", "6.0");
        //  deviceName 设备号 IOS：instruments -s devices，Android: adb devices
        //
        // * 使用adb devices 查找deviceName
        cap.setCapability("deviceName", "CJL5T15C26022372");
        // 2.在 Windows 终端运⾏ 'adb shell dumpsys window windows | findstr mFocusedApp’
        //  com.eno.xyzq.page/com.xyzq.main.mainpage.MainActivity
        //  appPackage 启动的包
        cap.setCapability("appPackage", "com.eno.xyzq.page");
        //  appActivity 启动的Activity
        cap.setCapability("appActivity", "com.xyzq.main.SplashActivity");
        // 'noReset': 'True',  # 每次运行不重新安装APP
        cap.setCapability("noReset", "True");
        cap.setCapability("newCommandTimeout", "6000");
        cap.setCapability("automationName", "UiAutomator2");
        
        //  app 安装文件路径：/abs/path/to/my.apk or http://myapp.com/app
        // 'app': 'C:\\Users\\wangli\\Desktop\\kbgz-v5.7.0-release.apk',  # APP文件路径
        
        // 会导致输入法变成appium的,所以把这段先注释掉     
        // 是否使用unicode键盘输入，在输入中文字符和unicode字符时设置为true
        // 如果插入中文,需要在desired_caps里面增加2个参数:  
        // cap.setCapability("unicodeKeyboard", "True");
        // cap.setCapability("resetKeyboard", "True");
        
        //A new session could not be created的解决方法
        // cap.setCapability("appWaitActivity", "com.android.calculator2.Calculator");
        
        //每次启动时覆盖session，否则第二次后运行会报错不能新建session
        // cap.setCapability("sessionOverride", true);
        
        //  与appium - server的通信协议
        //  连接了appium,通过appium连接到了手机,这样进行操作  
        driver = new AndroidDriver<AndroidElement>(new URL("http://127.0.0.1:4723/wd/hub"), cap);
    }
    
    @Test
    public void test1Login() throws InterruptedException {
        long start = System.currentTimeMillis();
        AndroidElement my;
        // 我的页面,点击  ,长期统计数据,都要超过4秒,那就给6秒吧,省的多次获取数据了   
        TimeUnit.SECONDS.sleep(6);
        my = new WebDriverWait(driver, 15)
                .until(driver -> {
                            AndroidElement my0 = null;
                            try {
                                //我的  .findElementByXPath("//*[contains(@text,'我的')]");
                                //com.eno.xyzq.page:id/rb_my
                                my0 = ((AppiumDriver<AndroidElement>) driver)
                                        .findElementById("com.eno.xyzq.page:id/rb_my");
                            } catch (Exception e) {
                                // e.printStackTrace();
                            }
                            return my0;
                        }
                );
        my.click();
        System.out.println(System.currentTimeMillis() - start);
        //登录 
        TimeUnit.MILLISECONDS.sleep(200);
        AndroidElement login = driver.findElementById("com.eno.xyzq.page:id/iv_login");
        login.click();
        
        //点击密码输入框
        TimeUnit.MILLISECONDS.sleep(200);
        AndroidElement passwordInput = driver.findElementsByClassName("android.widget.EditText").get(1);
        passwordInput.click();
        
        // 不可以直接输入,即使点击了确定,也会提示输入交易密码,必须使用他们的键盘
        // passwordInput.sendKeys("566038");
        // AndroidElement sure = driver.findElementById("com.eno.xyzq.page:id/fundacc_login_button");
        // sure.click();
        //输入密码 566038 
        //5
        TimeUnit.MILLISECONDS.sleep(1500);
        new TouchAction<>(driver).press(PointOption.point(548, 1436)).release().perform();
        //6
        TimeUnit.MILLISECONDS.sleep(100);
        new TouchAction<>(driver).press(PointOption.point(757, 1439)).release().perform();
        //6
        TimeUnit.MILLISECONDS.sleep(100);
        new TouchAction<>(driver).press(PointOption.point(757, 1439)).release().perform();
        //0
        TimeUnit.MILLISECONDS.sleep(100);
        new TouchAction<>(driver).press(PointOption.point(551, 1739)).release().perform();
        //3
        TimeUnit.MILLISECONDS.sleep(100);
        new TouchAction<>(driver).press(PointOption.point(762, 1270)).release().perform();
        //8
        TimeUnit.MILLISECONDS.sleep(100);
        new TouchAction<>(driver).press(PointOption.point(542, 1589)).release().perform();
        
        //点击登录确认按钮,这个按钮会被输入框遮住,所以需要通过坐标点击(985,1739)    
        TimeUnit.MILLISECONDS.sleep(100);
        new TouchAction<>(driver).press(PointOption.point(985, 1739)).release().perform();
        // AndroidElement loginButton = driver.findElementById("com.eno.xyzq.page:id/fundacc_login_button");
        // loginButton.click();
        TimeUnit.SECONDS.sleep(1);
        new TouchAction<>(driver).press(PointOption.point(985, 1739)).release().perform();
        //
        System.out.println("登录成功");
    }
    
    @Test
    public void test2Buy() throws InterruptedException {
        //交易按钮
        TimeUnit.SECONDS.sleep(1);
        AndroidElement trade = driver.findElementById("com.eno.xyzq.page:id/rb_trade");
        trade.click();
        
        //点击买入按钮
        // 3. text ://*[contains(@text,'WLA')]
        TimeUnit.MILLISECONDS.sleep(200);
        AndroidElement buy = driver.findElementByXPath("//*[contains(@text,'买入')]");
        buy.click();
        
        //输入证券代码
        TimeUnit.MILLISECONDS.sleep(200);
        AndroidElement stockInput = driver.findElementByXPath("//*[contains(@text,'证券代码')]");
        stockInput.click();
        //输入需要买的代码
        stockInput.sendKeys("000001");
        
        //点击为限价单
        TimeUnit.MILLISECONDS.sleep(200);
        AndroidElement limit = driver.findElementById("com.eno.xyzq.page:id/btn_price_type");
        limit.click();
        
        //买的仓位为全仓
        TimeUnit.MILLISECONDS.sleep(200);
        AndroidElement allBuy = driver.findElementById("com.eno.xyzq.page:id/rb_all_buy");
        allBuy.click();
        
        //点击买入按钮
        TimeUnit.MILLISECONDS.sleep(200);
        AndroidElement buyButton = driver.findElementById("com.eno.xyzq.page:id/button");
        buyButton.click();
        
        //确认按钮  
        TimeUnit.MILLISECONDS.sleep(500);
        AndroidElement sure = driver.findElementByXPath("//*[contains(@text,'确定')]");
        sure.click();
        System.out.println("买入成功");
        
        //  需要按返回键 ,获取页面元素再点击 
        TimeUnit.MILLISECONDS.sleep(200);
        AndroidElement topBack = driver.findElementById("com.eno.xyzq.page:id/top_back");
        topBack.click();
    }
    
    @Test
    public void test3Sell() throws InterruptedException {
        //交易按钮
        TimeUnit.SECONDS.sleep(1);
        AndroidElement trade = driver.findElementById("com.eno.xyzq.page:id/rb_trade");
        trade.click();
        
        //点击卖出按钮
        // 3. text ://*[contains(@text,'WLA')]
        TimeUnit.MILLISECONDS.sleep(200);
        AndroidElement sell = driver.findElementByXPath("//*[contains(@text,'卖出')]");
        sell.click();
        
        //输入证券代码
        TimeUnit.MILLISECONDS.sleep(200);
        AndroidElement stockInput = driver.findElementByXPath("//*[contains(@text,'证券代码')]");
        stockInput.click();
        //输入需要卖的代码
        stockInput.sendKeys("000001");
        
        //点击为限价单
        TimeUnit.MILLISECONDS.sleep(200);
        AndroidElement limit = driver.findElementById("com.eno.xyzq.page:id/btn_price_type");
        limit.click();
        
        //卖的仓位为全仓
        TimeUnit.MILLISECONDS.sleep(200);
        AndroidElement allSell = driver.findElementByXPath("//*[contains(@text,'全仓')]");
        allSell.click();
        
        //点击卖入按钮
        TimeUnit.MILLISECONDS.sleep(200);
        AndroidElement sellButton = driver.findElementById("com.eno.xyzq.page:id/button");
        sellButton.click();
        
        // 确认按钮需要点击 买入和卖出都要 
        TimeUnit.MILLISECONDS.sleep(500);
        AndroidElement sure = driver.findElementByXPath("//*[contains(@text,'确定')]");
        sure.click();
        System.out.println("卖出成功");
        
        //  需要按返回键 ,获取页面元素再点击 
        TimeUnit.MILLISECONDS.sleep(200);
        AndroidElement topBack = driver.findElementById("com.eno.xyzq.page:id/top_back");
        topBack.click();
        
    }
    
    @Test
    public void test4Optional() throws InterruptedException {
        // //获取自选列表
        try {
            TimeUnit.MILLISECONDS.sleep(200);
            AndroidElement optional = driver.findElementById("com.eno.xyzq.page:id/rb_optional");
            optional.click();
        } catch (Exception e) {
            
        } finally {
            
        }
        
    }
    
    public static void sell3() {
        
    }
    
    @AfterClass
    public static void after() {
        if (driver != null) {
            driver.quit();
        }
    }
    
}
